diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-09-30 22:13:07 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-09-30 22:13:07 +0200 |
| commit | a725d4c7d28fee701b6997cc46cffddefbcd26bf (patch) | |
| tree | 1e0899dc9fa67f8c74d7e4b7023881959d571d4f /src/routes/projects/[id] | |
| parent | a17b24b8e95bf85a8522fc0c2cbbdb8da31bf018 (diff) | |
Allow granular routine frequencies like 5/2w
Diffstat (limited to 'src/routes/projects/[id]')
| -rw-r--r-- | src/routes/projects/[id]/+page.server.ts | 9 | ||||
| -rw-r--r-- | src/routes/projects/[id]/+page.svelte | 27 |
2 files changed, 15 insertions, 21 deletions
diff --git a/src/routes/projects/[id]/+page.server.ts b/src/routes/projects/[id]/+page.server.ts index 3321bcd..83d7571 100644 --- a/src/routes/projects/[id]/+page.server.ts +++ b/src/routes/projects/[id]/+page.server.ts @@ -9,11 +9,8 @@ import { loadArchived, } from '$lib/server/services/routines'; import { completeRoutineAction } from '$lib/server/services/routine-actions'; -import { - numericId, - parseFormString, - parseFrequencyDays, -} from '$lib/server/services/validation'; +import { numericId, parseFormString } from '$lib/server/services/validation'; +import { Frequency } from '$lib/shared/frequency'; import type { Actions, PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ params }) => { @@ -44,7 +41,7 @@ export const actions: Actions = { await add( numericId(params.id), name, - parseFrequencyDays(data.get('frequencyDays')), + Frequency.parse(data.get('frequency')?.toString() ?? '').toSpec(), ); } catch { return fail(400, { error: 'Fréquence invalide' }); diff --git a/src/routes/projects/[id]/+page.svelte b/src/routes/projects/[id]/+page.svelte index 7d9a146..f93e018 100644 --- a/src/routes/projects/[id]/+page.svelte +++ b/src/routes/projects/[id]/+page.svelte @@ -6,11 +6,8 @@ import StatusBadge from '$lib/components/StatusBadge.svelte'; import Button from '$lib/components/Button.svelte'; import Row from '$lib/components/Row.svelte'; - import { - formatFrequency, - parseIntervalToDays, - type RoutineState, - } from '$lib/shared/routine-metrics'; + import type { RoutineState } from '$lib/shared/routine-metrics'; + import { Frequency } from '$lib/shared/frequency'; import SectionTitle from '$lib/components/SectionTitle.svelte'; import { formatDayMonth } from '$lib/shared/temporal'; import { filterByName } from '$lib/shared/filter-items'; @@ -20,7 +17,7 @@ let name = $state(''); let frequency = $state(''); - const frequencyDays = $derived(parseIntervalToDays(frequency)); + const freq = $derived(Frequency.safeParse(frequency)); let showArchived = $state(false); let archiveFilter = $state(''); @@ -83,25 +80,25 @@ /> <input class="form-input frequency-input" - class:input-invalid={frequency !== '' && frequencyDays === null} + class:input-invalid={frequency !== '' && freq === null} type="text" - name="frequencyDays" + name="frequency" bind:value={frequency} - placeholder="2w" + placeholder="2w, 5/2w" autocomplete="off" - aria-label="Intervalle (ex: 1d, 2w, 3m)" + aria-label="Fréquence (ex : 2w, 5/2w)" /> <Button variant="accent" - disabled={!name.trim() || frequencyDays === null} + disabled={!name.trim() || freq === null} ariaLabel="Ajouter" > + </Button> </form> - {#if frequency !== '' && frequencyDays === null} - <p class="error">Intervalle invalide — ex : 1d, 2w, 3m, 1y</p> + {#if frequency !== '' && freq === null} + <p class="error">Fréquence invalide — ex : 1d, 2w, 5/2w</p> {/if} {#if form?.error} @@ -136,7 +133,7 @@ >{routine.name}</a > <span class="routine-meta"> - {formatFrequency(routine.frequencyDays)} + {Frequency.parse(routine.frequency).format()} {#if routine.lastDoneAt} · fait le {formatDayMonth(routine.lastDoneAt)} {:else} @@ -184,7 +181,7 @@ >{routine.name}</a > <span class="archived-date"> - {formatFrequency(routine.frequencyDays)} · archivée le + {Frequency.parse(routine.frequency).format()} · archivée le {formatDayMonth(routine.archivedAt)} </span> </Row> |
